//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
/********************************************************
    说明：
    1、默认串口1波特率115200bps，可动态设置波特率OTA模式下好。
    2、支持获取boot信息。
    3、支持获取分区表信息。
    4、支持共享数据访问。
    5、支持重启boot。
    6、支持启动app。
    7、支持擦除指定页。
    8、支持烧录指定地址。
    9、账号登陆及加密传输目前未支持。
**********************************************************/

#ifndef __APP_BOOTLOADER_H__
#define __APP_BOOTLOADER_H__

#include <stdbool.h>
#include "../BSP/FLASH_BSP/flash_bsp.h"
#include "../Driver/Debug_Driver/debug_driver.h"
#include "../../Tool/CRC/crc.h"


typedef struct
{
	char type[16];      /* STM32F103VE */
	char version[8];    /* V1.0.0 */
    char comm_mode[8];  /* RS485 */
    char verify_mode[8];/* CRC16 */
}Bootloader_t;          /* bootloader信息 */

#define Bootloader_Default_Value   \
{                                  \
    .type        = "STM32F103VE",  \
    .version     = "V1.0.0",       \
    .comm_mode   = "RS485",        \
    .verify_mode = "CRC16",        \
}


typedef struct
{
    uint32_t bootloader_pos;   /* bootloader开始位置 */
    uint32_t bootloader_size;  /* bootloader大小 */
    uint32_t app_pos;          /* app开始位置 */
    uint32_t app_size;         /* app大小 */
    uint32_t public_data_pos;  /* 公共数据位置 */
    uint32_t public_data_size; /* 公共数据大小 */
    uint32_t flash_page_size;  /* flash页大小 */
    uint32_t flash_page_count; /* flash页个数 */
    uint32_t flash_size;       /* flash总大小 */
}Partition_Table_t;            /* 分区表信息 */

#define Partition_Table_Defalut_Value                           \
{                                                               \
    .bootloader_pos   = FLASH_BASE_ADDR,                        \
    .bootloader_size  = FLASH_PAGE_SIZE * 8,                    \
    .app_pos          = FLASH_BASE_ADDR + FLASH_PAGE_SIZE * 8,  \
    .app_size         = FLASH_PAGE_SIZE * 55,                   \
    .public_data_pos  = FLASH_BASE_ADDR + FLASH_PAGE_SIZE * 63, \
    .public_data_size = FLASH_PAGE_SIZE,                        \
    .flash_page_size  = FLASH_PAGE_SIZE,                        \
    .flash_page_count = 128,                                    \
    .flash_size       = FLASH_PAGE_SIZE * 128,                  \
}

typedef enum
{
    Set_BaudRate,            //临时设置波特率，默认115200密钥
    Get_Boot_Inof,           //获取boot信息
    Get_Partition_Table_Info,//获取分区表信息
	Get_Public_Data,         //获取共享数据
	Reboot,                  //重启boot
    RunApp,                  //运行app
    Account_Login,           //账号登录，默认admin,admin
	Erase_Page,              //擦除指定页
	Get_Erase_State,         //获取擦除状态
	Program_Addr,            //烧录指定地址
}Cmd_enum;

typedef enum
{
    Dir_MCU,
    Dir_PC,
}Dir_enum;


/*
地址   方向    命令       长度      数据缓存         CRC校验
01     01    Cmd_enum    xx      buffer[xxxx]      CRC16
*/
typedef struct
{
    uint8_t addr;
    Dir_enum dir;
    Cmd_enum cmd;
    uint8_t buffer_length;
    uint8_t buffer[2];
    //uint16_t crc;
}Message_t;


// 跳转到Bootloader的函数
void Jump_To_Bootloader(void);
// 跳转到应用程序
void Jump_To_APP(void);
// 检查应用程序是否有效
bool Check_APP_Valid(void);
// 检查是否进入Bootloader模式
bool Check_Bootloader_Mode(void);
// 处理Bootloader协议
void Handle_Bootloader(void);

#endif
